/**
 * 函数curry化：
 */
function curry(fn) {
    var args = [].slice.call(arguments, 1);
    return function () {
        return fn.apply(this, args.concat([].slice.call(arguments)));
    };
}
function add(a, b) {
    return a + b;
}
let addCurry = curry(add);
addCurry(1)(2);

function curry2(fn, args) {
    var length = fn.length;
    args = args || [];
    return function () {
        var _args = args.slice(0),
            arg,
            i;
        for (i = 0; i < arguments.length; i++) {
            arg = arguments[i];
            _args.push(arg);
        }
        if (_args.length < length) {
            return curry.call(this, fn, _args);
        } else {
            return fn.apply(this, _args);
        }
    };
}

var fn = curry2(function (a, b, c) {
    console.log([a, b, c]);
});

fn("a", "b", "c"); // ["a", "b", "c"]
fn("a", "b")("c"); // ["a", "b", "c"]
fn("a")("b")("c"); // ["a", "b", "c"]
fn("a")("b", "c"); // ["a", "b", "c"]


//  curry-实现sum(1)(2)(3)(4)...无限累加：
//参数确定的情况
function curry(fn) {
    return function sum(...args){
       if(args.length < fn.length){
          return function(){
              return sum(...args,...arguments);
          }
       }
       return fn(...args);
    }
  }
  function add(a, b, c) {
     return a + b + c;
  }
  let addCurry = curry(add);
  // addCurry(1,2);
  console.log(addCurry(1)(2)(3));
  console.log(addCurry(1,2)(3));
  
  //参数不确定
function curry(fn) {
     let params = [];
     return function sum(...args){
        if(args.length){
           params = [...params,...args];
           return sum;
        }
        return fn(params);
     }
  }
  function add(arr) {
     return arr.reduce((a,b)=>a+b,0)
  }
  let addCurry = curry(add);
  // addCurry(1,2);
  console.log(addCurry(1)(2)(3)(4)(10,20)());

  //curry-腾讯面试题 
  //题目：用JS实现一个柯里化方法myCurry，并实现下面的输出效果。

    
//参数不确定
function myCurry(fn) {
    let args = [].slice.call(arguments,1);
    let curried = function () {
        const allargs = [...args,...arguments];
        return myCurry.call(null,fn,...allargs);
    };
    curried.toString = function(){
        return fn.apply(null,args)
    }
    return curried;
}
var fn = myCurry(function(...arguments) {
    console.log(arguments);
});
    
fn(1, 2, 3) // [1, 2, 3]
fn(1, 2)(3) // [1, 2, 3]
fn(1)(2)(3) // [1, 2, 3]
fn(1)(2, 3) // [1, 2, 3]
